package com.sinog.front.controller.biz;

import com.alibaba.fastjson.JSON;
import com.sinog.core.model.UserDTO;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.utilbean.Constants;
import com.sinog.core.utilbean.Result;
import com.sinog.core.utilbean.ReturnCode;
import com.sinog.front.config.idempotent.Idempotent;
import com.sinog.front.config.log.Log;
import com.sinog.front.feign.biz.BjdxInfoService;
import com.sinog.front.feign.biz.BjdxMvInfoService;
import com.sinog.front.feign.biz.DataToRedisService;
import com.sinog.front.service.user.UserFacade;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @desc 安置帮教管理 - 帮教对象信息管理 - 户籍迁出人员管理 - HjqcryglController
 * @author sunsf
 * @date 2020-02-07-13:51
 */
@Slf4j
@RestController
public class HjqcryglController {

    @Resource
    private UserFacade userService;
    @Resource
    private BjdxMvInfoService bjdxMvInfoService;
    @Resource
    private BjdxInfoService bjdxInfoService;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private DataToRedisService dataToRedisService;

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 户籍迁出人员管理 - 列表
     * @param pageIndex pageIndex
     * @param pageSize pageSize
     * @param sortField 排序字段
     * @param sortOrder 排序方式
     * @param request request
     * @return String
     */
    @RequestMapping("/azbj/azbjgl/bjdxInfo/hjqcrygl/list")
    public String toHjqrryglPublicList(Integer pageIndex,Integer pageSize,String sortField,String sortOrder,HttpServletRequest request) {
        String key = request.getParameter("querykey");
        UserDTO user = userService.getAuthentication();
        return bjdxMvInfoService.getHjqcglList(pageIndex,pageSize,
                                                key,
                                                user.getDepartid(),
                                                Integer.parseInt(user.getLevel()),
                                                user.getOrgid(),
                                                sortField,sortOrder);
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 户籍迁出人员管理 - 审核页面 - 保存
     * @param request request
     * @param data data
     * @return Result
     */
    @Log(type = "更新", value = "户籍迁出上级审核")
    @Idempotent(paramPos = {1})
    @RequestMapping("/azbj/bjdxInfo/hjqc/shenheSave")
    public Result shenheSave(HttpServletRequest request,
                             @RequestParam(required = false, defaultValue = "-1") String data) {
        UserDTO user = userService.getAuthentication();
        data = JsonUtil.setObjectToJsonStr(data, "updateUser",user.getAccount(), "updateTime",new Date(),"thlxr",user.getUsername(),"thlxdh",user.getPhone());
        return bjdxMvInfoService.saveBaseInfo(data);
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 户籍迁出人员管理 - 迁移办理 - 姓名搜索
     * @param key 输入姓名
     * @return List<Map < String,Object>>
     */
    @RequestMapping("/azbj/bjdxInfo/hjqr/addPrisonerMv/getPrisonerList")
    public List<Map<String,Object>> getPrisonerList(@RequestParam(required = false, defaultValue = "-1") String key) {
        //当输入框为空时候，返回空，不返回全部
        if(StringUtils.equals(key,Constants.NumberStr.NUM_STR_FU_ONE)) {
            return null;
        }
        UserDTO user = userService.getAuthentication();
        String departId = user.getDepartid();
        int level = Integer.parseInt(user.getLevel());
        return bjdxMvInfoService.getPrisonerList(key,departId,level);
    }

    /**
     * 首页 - 行政区划搜索
     * @param key key
     * @param num num
     * @return List<String>
     */
    @RequestMapping("/azbj/bjdxInfo/hjqr/addPrisonerMv/getOrgList")
    public List<String> getDq(@RequestParam(required = false) String key,int num) {
        //todo 下面判断依据是什么
        if(StringUtils.isEmpty(key)) {
            return null;
        }
        //存储返回结果：省市区县字符串
        List<String> strings = new ArrayList<>(16);
        //条件集合：行政区划
        List<String> codes = new ArrayList<>(16);
        try {
            Map<Object,Object> areaCode = stringRedisTemplate.opsForHash().entries("areaCode");
            //初始化i，j
            //i：
            //j：标记value匹配的次数
            //当查询的数据不在当前页，跳过判断，
            int j = 0;
            for(Map.Entry<Object,Object> m : areaCode.entrySet()) {
                //当匹配成功的次数大于需要查看的页码范围，直接返回
                if(j > 9 * num) {
                    break;
                } else {
                    //比如，现在查询第二页，num==2，但是现在匹配到了第28条，则该条不需要比较
                    if(m.getValue().toString().contains(key)) {
                        if(j < 9 * (num - 1)) {
                            j++;
                        } else if(j > 9 * num) {
                            break;
                        } else {
                            j++;
                            codes.add(m.getKey().toString());
                        }
                    }
                }
            }
            String jsonString;
            if(!codes.isEmpty()) {
                jsonString = JSON.toJSONString(codes);
                strings = dataToRedisService.selectAreaStr(jsonString);
            }
        } catch(RuntimeException e) {
            log.error("发生异常:",e);
            //todo 为什么返回null
            return null;
        }
        return strings;
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 户籍迁出人员管理 - 撤回
     * @param request request
     * @param id id
     * @param state 审批状态:0:司法所迁出撤回；1:迁出审批中；2:迁出审批成功；3:迁出审批失败；4:司法所迁入撤回；5:迁入审批中；6:迁入审批成功；7:迁入审批失败；
     * @return Result
     */
    @Log(type = "更新", value = "户籍迁入、迁出申请，未审核的记录撤回")
    @Idempotent(paramPos = {1,2})
    @RequestMapping("/azbj/bjdxInfo/hjqc/toRevoke")
    public Result toRevoke(HttpServletRequest request,
                           @RequestParam(required = false, defaultValue = "-1") String id,
                           @RequestParam(required = false, defaultValue = "-1") String state) {
        //todo 下面判断依据是什么
        if(StringUtils.equals(id,Constants.NumberStr.NUM_STR_FU_ONE)) {
            return null;
        }
        return bjdxMvInfoService.toRevoke(id,state);
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 户籍迁出人员管理 - 迁移办理 - 保存
     * @param request request
     * @param data data
     * @return Result
     */
    @Log(type = "新增", value = "户籍迁出申请新增")
    @Idempotent(paramPos = {1})
    @RequestMapping("/azbj/bjdxInfo/hjqr/addPrisonerMv/saveMvPrisoner")
    public Result saveMvPrisoner(HttpServletRequest request,
                                 @RequestParam(required = false, defaultValue = "-1") String data) {
        UserDTO user = userService.getAuthentication();
        //参数转换map
        Map<String,Object> jsonMap = JsonUtil.toMap(data);
        String priNum = (String)jsonMap.get("priNum");
        //todo 下面逻辑有点乱
        boolean mark = StringUtils.equals(priNum,"-1") || (null != priNum && priNum.isEmpty());
        if(mark) {
            return Result.failure(ReturnCode.SAVE_FAILED);
        }
        Date date = new Date();
        Map<String,Object> prisonerMap = bjdxInfoService.getBaseInfoByPriNumMap(priNum);
        //todo 下面map参数转换需要优化
        //服刑人员编号
        jsonMap.put("priNum",priNum);
        //迁入地区
        jsonMap.put("inAreaid",jsonMap.get("nativeinvill"));
        //迁入地区name
        jsonMap.put("inAreaname",jsonMap.get("nativeinvillName"));
        //迁出地区
        jsonMap.put("outAreaid",user.getDepartid());
        //迁出地区name
        jsonMap.put("outAreaname",user.getDepartName());
        jsonMap.putAll(prisonerMap);
        //审批状态
        jsonMap.put("state",Constants.Number.NUM_ONE);
        //时间
        jsonMap.put("thedate",date);
        //创建时间
        jsonMap.put("createTime",date);
        //更新时间
        jsonMap.put("updateTime",date);
        String dataStr = JsonUtil.toText(jsonMap);
        return bjdxMvInfoService.saveBaseInfo(dataStr);
    }
}